package com.example.design.singleton;

/**
 * 双重锁检测-解决懒汉模式 线程不安全问题
 */
public class Singleton3 {

    public  static Singleton3  instance;

    private  Singleton3(){
        System.out.println("构造方法");
    }
//. 提供一个公开的方法来返回这个类的唯一实例
    //不建议这样写的原因.若干个线程同时在调用getInstance方法
    //T1 - getInstance方法 - 假设竞争"锁资源" - 对象 - 申请到了,才会进去执行
    //T1执行完结束,自动释放锁资源

    //T2... Tn 会继续争抢getInstance - > "锁"
    //导致后面的线程频繁去申请锁 - "重量级的对象 - 比较消耗资源"

    //}

    public  static  Singleton3 getInstance(){
        //判断instance是否为空
        if(instance==null){
                    //  T1   T2
            synchronized (Singleton3.class){      //同一时间只有一个线程可以进去
                if(instance==null){
                    instance=new Singleton3();
                }
            }
        }

        return   instance;
    }
}


class   SingelTest3{
    public static void main(String[] args) {
        Singleton3 s1=Singleton3.getInstance();
        Singleton3 s2=Singleton3.getInstance();
        System.out.println(s1==s2);
    }
}
